﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QDebug>
#include <QString>
#include <QTime>
#include <QTimer>
#include <QList>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QAbstractButton>
#define MAX_COUNTER 9999999
#define setbit(x, y)    x|=(1<<y)   // x 第 y 位置1
#define clrbit(x, y)    x&=~(1<<y)  // x 第 y 位置0
#define getbit(x, y)    ((x) >> (y)&1)  // 取出 x 第 y 位


#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

//#pragma execution_character_set("utf-8")

struct CoordInfo
{
  int x;
  int y;
  int z;
};

struct CommandInfo
{
  char Type;   // 0x01预定义点
  QString GCode;
};


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    bool OpenPort(QString GcodePortName, QString CmdPortName, int GcodePortBaudReteValue = 115200, int CmdPortBaudReteValue = 115200);
    bool SendGcode(QString message);
    bool SendCmd(QString message);
    void Unlock();

private:
    QTimer m_timer;

    int  m_iCounter;

    QString m_lastFolder;
    //
    QStandardItemModel *m_pModel;

    QStringList m_status;
    int status;
    int laststatus;
    bool gcode_ok;

    //指令链表
    QStringList m_commandList;
    //当前已发送指令顺序
    int m_index;

    //模式选择
    bool m_bAutoMode;

    //运行状态
    bool m_bRunStatus;

    //配置文件中的
    QString m_szGCodeProtName;
    QString m_szCmdProtName;

    int m_iGCodeProtBaud;
    int m_iCmdProtBaud;

    QString m_szAutoCommadFile;

    int m_dStep;

    void ChangePosition(int x,int y,int z);

private:
    //
    QImage *m_pXImage;
    QImage *m_pYImage;
    QImage *m_pZImage;
    QImage *m_pZRImage;
    //初始化加载图片
    void InitLoadImage();
    //执行仿真
    void Simulated();

    //
    QTimer *m_pVideoTimer;
    VideoCapture m_pCapture;

    //Mat frame;
    //Mat result_frame;

    void InitVideo();
private slots:
    void ReadFrame();

//    void on_btnOpenVideo_clicked();

//   void on_btnCloseVideo_clicked();

private:
    void InitSettings();


    void UiConnect();
    void SerialPortConnect();

    void InitModel();

    void loadFile(QString fileName);
    void loadFileData(QList<QString>);
    QString ByteArrayToHexString(QByteArray data);

    void SendCommanLoop();
private slots:

    //X
    void BtnXplusClickedSlot();
    void BtnXminusClickedSlot();
    //Y
    void BtnYplusClickedSlot();
    void BtnYminusClickedSlot();
    //Z
    void BtnZplusClickedSlot();
    void BtnZminusClickedSlot();

    //LCD记件数相关 TODO::测试
    void BtnCounterZeroClickedSlot();
    void OnCounterChangedSlot(int num);
    void OnLcdTimerSlot();

    //编辑
    void onTableClicked(const QModelIndex &index);
    void BtnOpenFileSlot();
    void BtnModifyCoordSlot();
    void BtnSaveCoordSlot();

    //serial port
    void ReadGcodeReturn();
    void ReadCmdReturn();
    void GetStatusFun();

    //
    void BtnSimulatedClickedSlot();

    //
    void OnModeButtonClicked(QAbstractButton*);

    //急停暂停
    void BtnStopButtonClickedSlot();
    void BtnPauseButtonClickedSlot();

private:
    Ui::MainWindow *ui;

    QSerialPort *GcodePort;
    QSerialPort *CmdPort;
    QTimer StatusTimer;
};

#endif // MAINWINDOW_H
